package com.cysoft.starter.log.core.repository.impl;

import com.alibaba.fastjson.JSON;
import com.cysoft.starter.log.core.model.LogInfo;
import com.cysoft.starter.log.core.properties.output.ElasticSearchProperties;
import com.cysoft.starter.log.core.repository.DataRepository;
import lombok.extern.slf4j.Slf4j;
import org.frameworkset.elasticsearch.client.ClientInterface;

/**
 * @author 玖零
 * @version V0.0.1
 * @project cysoft-spring-boot-starter-log
 * @package com.cysoft.starter.log.core.repository.impl
 * @date 2025-02-27 23:38
 * @desc Elasticsearch日志存储实现类
 */
@Slf4j
public class ElasticsearchRepository implements DataRepository {

    /**
     * 用于与Elasticsearch客户端进行交互的接口
     */
    private final ClientInterface clientInterface;

    /**
     * Elasticsearch的配置信息
     */
    private final ElasticSearchProperties elasticSearchProperties;

    /**
     * 构造函数，初始化ElasticsearchRepository类的实例
     *
     * @param clientInterface       Elasticsearch模板，用于与Elasticsearch进行交互
     * @param elasticSearchProperties Elasticsearch的配置信息，包含索引名等配置
     */
    public ElasticsearchRepository(ClientInterface clientInterface, ElasticSearchProperties elasticSearchProperties) {
        this.clientInterface = clientInterface;
        this.elasticSearchProperties = elasticSearchProperties;
    }

    /**
     * 实现DataRepository接口的output方法，用于将日志信息输出到Elasticsearch
     *
     * @param logInfo 要输出的日志信息对象
     */
    @Override
    public void output(LogInfo logInfo) {
        // 记录开始输出日志数据的信息，使用debug级别，在生产环境可根据需要调整日志级别
        log.debug("********************本次请求-输出日志数据信息-开始********************");
        // 记录日志信息的详细内容，使用debug级别
        log.debug("logInfo：{}", JSON.toJSONString(logInfo));
        // 记录结束输出日志数据的信息，使用debug级别
        log.debug("********************本次请求-输出日志数据信息-结束********************");

        try {
            // 调用clientInterface的addDocument方法将日志信息添加到Elasticsearch指定索引中
            String result = clientInterface.addDocument(elasticSearchProperties.getIndexName(), logInfo);
            // 记录添加文档操作的结果，使用info级别
            log.info("********************result:{}********************", result);
        } catch (Exception e) {
            // 捕获并记录添加文档操作可能抛出的异常，使用error级别
            log.error("将日志信息添加到Elasticsearch时发生异常", e);
        }
    }
}
